Skip to content

函数输入输出说明 (Function I/O Clarification)

在创建 Gradio Interface 时,一个核心概念是理解您的 Python 函数如何与输入和输出组件进行交互。本文将详细解释 Gradio 如何处理不同类型的函数参数和返回值。

基本映射原则

gr.Interface 中,每个输入组件对应函数的一个参数,每个输出组件对应函数返回值的一个元素。例如:

python
import gradio as gr

def greet(name, intensity):
    return "Hello, " + name + "!" * int(intensity)

demo = gr.Interface(
    fn=greet,
    inputs=["text", gr.Slider(minimum=1, maximum=10)],
    outputs=["text"]
)

demo.launch()

在这个例子中,greet 函数有两个参数(nameintensity),对应两个输入组件("text"gr.Slider)。函数返回一个字符串,对应一个输出组件("text")。

输入组件到函数参数的数据转换

每种输入组件都会对用户提供的输入进行预处理,然后将数据传递给您的函数:

组件类型数据类型描述
gr.Textbox()str文本框内容作为字符串
gr.Number()floatint数字值(整数或浮点数)
gr.Slider()floatint滑块位置的值
gr.Checkbox()bool复选框状态(True/False)
gr.Radio()字符串或列表中的元素选择的选项值
gr.Dropdown()字符串、列表中的元素或选择项列表选择的选项或选项列表
gr.Image()numpy.ndarrayPIL.Image 或文件路径取决于 type 参数
gr.Audio()numpy.ndarray 或文件路径取决于 type 参数
gr.File()文件路径上传文件的临时路径

函数返回值到输出组件的数据转换

函数的返回值会被传递给输出组件,然后输出组件将数据显示给用户:

python
def image_classifier(img):
    # 处理图像并返回标签和置信度
    return {
        "cat": 0.8,
        "dog": 0.2
    }

demo = gr.Interface(
    fn=image_classifier,
    inputs=gr.Image(type="pil"),  # 接收PIL图像
    outputs=gr.Label()  # 显示标签和置信度
)

多返回值处理

如果您的函数返回多个值,您可以通过返回元组或列表来实现,每个元素对应一个输出组件:

python
def analyze_text(text):
    word_count = len(text.split())
    sentiment = "positive" if "good" in text.lower() else "negative"
    return word_count, sentiment  # 返回两个值

demo = gr.Interface(
    fn=analyze_text,
    inputs="text",
    outputs=["number", "text"]  # 两个输出组件
)

使用Python类型提示

Gradio支持使用Python的类型提示来明确函数的输入和输出类型,这对于代码的可读性和IDE的类型检查非常有帮助:

python
from typing import Tuple
import numpy as np
import PIL

def process_image(img: PIL.Image.Image) -> Tuple[str, float]:
    # 处理图片
    return "cat", 0.98

demo = gr.Interface(
    fn=process_image,
    inputs=gr.Image(type="pil"),
    outputs=["label", "number"]
)

处理特殊数据类型

处理生成器函数

Gradio 支持生成器函数,可以用于渐进式更新输出组件:

python
import time

def slowly_reverse(text):
    for i in range(len(text)):
        yield text[:(len(text)-i)]
        time.sleep(0.1)

demo = gr.Interface(
    fn=slowly_reverse,
    inputs="text",
    outputs="text"
)

处理异步函数

Gradio 也支持异步函数(使用 async/await 语法):

```python

import asyncio

async def async_process(text): await asyncio.sleep(1) # 模拟异步处理 return text.upper()

demo = gr.Interface( fn=async_process, inputs="text", outputs="text" ) ```

常见错误和解决方案

参数数量不匹配

如果函数的参数数量与输入组件数量不匹配,Gradio 会抛出错误。确保函数参数与输入组件一一对应。

返回值数量不匹配

如果函数的返回值数量与输出组件数量不匹配,Gradio 也会抛出错误。确保返回适当数量的值,或者将多个返回值打包成元组或列表。

数据类型不兼容

如果返回的数据类型与输出组件不兼容,Gradio 会尝试进行转换,但可能失败。确保返回的数据类型与输出组件期望的类型兼容。

进阶用法:批处理模式

通过设置 batch=True,您可以让函数一次处理多个输入样本:

```python

def batch_process(texts): return [text.upper() for text in texts] # 处理文本列表

demo = gr.Interface( fn=batch_process, inputs="text", outputs="text", batch=True, max_batch_size=16 # 最大批处理大小 ) ```

当启用批处理模式时,函数的每个参数将接收一个输入列表,而不是单个输入。同样,函数应该返回一个列表作为输出。

总结

理解函数的输入和输出如何与 Gradio 组件交互是创建有效界面的关键。通过确保适当的数据类型和格式,您可以构建更加健壮和用户友好的应用程序。